## Griesmer upper bound and Griesmer's function

from PyM import *

def ub_griesmer(n,d,q=2):
    P = 1
    while n > 0:
        n = n - ceil(d/P)
        P = P*q
    return P

# Examples

show(ub_griesmer(8,3))
show(ub_griesmer(12,5))
show(ub_griesmer(13,5))
show(ub_griesmer(16,6))
show(ub_griesmer(14,9,3))

def griesmer(k,d,q=2):
    return sum([int(ceil(d/q**i)) for i in range(k)])

show(griesmer(4,3))
show(griesmer(5,7))
show(griesmer(12,7))
show(griesmer(6,5,3))